Ao ler ou gravar uma nova lista, verifique se a agenda atual já foi gravada.
Você pode usar uma variável para controlar quando a lista foi alterada (novo,
altera, apaga) e reinicializar esse valor quando ela for lida ou gravada.
Resposta:
##############################################################################
# Parte do livro Introdução à Programação com Python
# Autor: Nilo Ney Coutinho Menezes
# Editora Novatec (c) 2010-2024
# Primeira edição - Novembro/2010 - ISBN 978-85-7522-250-8
# Segunda edição - Junho/2014 - ISBN 978-85-7522-408-3
# Terceira Edição - Janeiro/2019 - ISBN 978-85-7522-718-3
#
# Site: https://python.nilo.pro.br/
#
# Arquivo: exercicios3\capitulo 09\exercicio-09-22.py
##############################################################################
agenda = []
# Variável para marcar uma alteração na agenda
alterada = False
def pede_nome():
return input("Nome: ")
def pede_telefone():
return input("Telefone: ")
def mostra_dados(nome, telefone):
print(f"Nome: {nome} Telefone: {telefone}")
def pede_nome_arquivo():
return input("Nome do arquivo: ")
def pesquisa(nome):
mnome = nome.lower()
for p, e in enumerate(agenda):
if e[0].lower() == mnome:
return p
return None
def novo():
global agenda, alterada
nome = pede_nome()
telefone = pede_telefone()
agenda.append([nome, telefone])
alterada = True
def confirma(operação):
while True:
opção = input(f"Confirma {operação} (S/N)? ").upper()
if opção in "SN":
return opção
else:
print("Resposta inválida. Escolha S ou N.")
def apaga():
global agenda, alterada
nome = pede_nome()
p = pesquisa(nome)
if p is not None:
if confirma("apagamento") == "S":
del agenda[p]
alterada = True
else:
print("Nome não encontrado.")
def altera():
global alterada
p = pesquisa(pede_nome())
if p is not None:
nome = agenda[p][0]
telefone = agenda[p][1]
print("Encontrado:")
mostra_dados(nome, telefone)
nome = pede_nome()
telefone = pede_telefone()
if confirma("alteração") == "S":
agenda[p] = [nome, telefone]
alterada = True
else:
print("Nome não encontrado.")
def lista():
print("\nAgenda\n\n------")
# Usamos a função enumerate para obter a posição na agenda
for posição, e in enumerate(agenda):
# Imprimimos a posição, sem saltar linha
print(f"Posição: {posição} ", end="")
mostra_dados(e[0], e[1])
print("------\n")
def lê():
global agenda, alterada
if alterada:
print(
"Você não salvou a lista desde a última alteração. Deseja gravá-la agora?"
)
if confirma("gravação") == "S":
grava()
print("Ler\n---")
nome_arquivo = pede_nome_arquivo()
arquivo = open(nome_arquivo, "r", encoding="utf-8")
agenda = []
for l in arquivo.readlines():
nome, telefone = l.strip().split("#")
agenda.append([nome, telefone])
arquivo.close()
alterada = False
def ordena():
global alterada
# Você pode ordenar a lista como mostrado no livro
# com o método de bolhas (bubble sort)
# Ou combinar o método sort do Python com lambdas para
# definir a chave da lista
# agenda.sort(key=lambda e: return e[0])
fim = len(agenda)
while fim > 1:
i = 0
trocou = False
while i < (fim - 1):
if agenda[i] > agenda[i + 1]:
# Opção: agenda[i], agenda[i+1] = agenda[i+1], agenda[i]
temp = agenda[i + 1]
agenda[i + 1] = agenda[i]
agenda[i] = temp
trocou = True
i += 1
if not trocou:
break
alterada = True
def grava():
global alterada
if not alterada:
print("Você não alterou a lista. Deseja gravá-la mesmo assim?")
if confirma("gravação") == "N":
return
print("Gravar\n------")
nome_arquivo = pede_nome_arquivo()
arquivo = open(nome_arquivo, "w", encoding="utf-8")
for e in agenda:
arquivo.write(f"{e[0]}#{e[1]}\n")
arquivo.close()
alterada = False
def valida_faixa_inteiro(pergunta, inicio, fim):
while True:
try:
valor = int(input(pergunta))
if inicio <= valor <= fim:
return valor
except ValueError:
print(f"Valor inválido, favor digitar entre {inicio} e {fim}")
def menu():
print("""
1 - Novo
2 - Altera
3 - Apaga
4 - Lista
5 - Grava
6 - Lê
7 - Ordena por nome
0 - Sai
""")
print(f"\nNomes na agenda: {len(agenda)} Alterada: {alterada}\n")
return valida_faixa_inteiro("Escolha uma opção: ", 0, 7)
while True:
opção = menu()
if opção == 0:
break
elif opção == 1:
novo()
elif opção == 2:
altera()
elif opção == 3:
apaga()
elif opção == 4:
lista()
elif opção == 5:
grava()
elif opção == 6:
lê()
elif opção == 7:
ordena()